% Created 2022-06-02 周四 08:40
% Intended LaTeX compiler: xelatex
\documentclass[a4paper]{article}
                 \usepackage{graphicx}
                 \usepackage{xcolor}
                 \usepackage{xeCJK}
                 \usepackage{fixltx2e}
                 \usepackage{longtable}
                 \usepackage{float}        
                 \usepackage{tikz}         
                 \usepackage{wrapfig}      
                 \usepackage{latexsym,amssymb,amsmath}
                 \usepackage{textcomp}
                 \usepackage{bicaption}
                 \usepackage{listings}     
                \usepackage{marvosym}     
                \usepackage{textcomp}     
                \usepackage{latexsym}     
                \usepackage{natbib}
                \usepackage{indentfirst}
		\usepackage{hyperref}
                \usepackage{geometry}
                \usepackage{minted}
                \setCJKmainfont{宋体}
                \setlength{\parindent}{2em}
                \usepackage{color}
                \usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhead[R]{\footnotesize{《Android 物联网应用程序开发》 广西职业师范学院实验教学指导书}}
\geometry{a4paper,left=2.5cm,right=2.5cm,top=2cm,bottom=2cm}
\setCJKmainfont{仿宋}
\setCJKsansfont{Microsoft YaHei}
\setCJKmonofont{Microsoft YaHei}

            \lstset{
  columns=fixed,       
  breaklines=true, breakautoindent=true,breakindent=4em,
  numbers=left,                                        % 在左侧显示行号
  frame=none,                                          % 不显示背景边框
  backgroundcolor=\color[RGB]{245,245,244},            % 设定背景颜色
  keywordstyle=\color[RGB]{40,40,255},                 % 设定关键字颜色
  numberstyle=\footnotesize\color{darkgray},           % 设定行号格式
  commentstyle=\it\color[RGB]{0,96,96},                % 设置代码注释的格式
  stringstyle=\rmfamily\slshape\color[RGB]{128,0,0},   % 设置字符串格式
  showstringspaces=false,                              % 不显示字符串中的空格
  language=java,                                        % 设置语言
}

\usemintedstyle{emacs}
    \setminted{%
        autogobble,% automatically remove the spaces to the left of the code
        linenos=true,% show line numbers
        fontsize=\small,% smaller font size
        % escapeinside=@@,% insert latex code between @ and @
        frame=lines,% frame styles: none or lines
        % frame=none,
        numbers=none,% show line numbers on: left, right, both or none
        mathescape=true,% insert math code
	breaklines=true,
    }%
    \setmintedinline{%
        fontsize=\smallsize,
    }%
\date{\today}
\title{实验十三: 数据存储实验}
\hypersetup{
 pdfauthor={},
 pdftitle={实验十三: 数据存储实验},
 pdfkeywords={},
 pdfsubject={},
 pdfcreator={Emacs 27.1 (Org mode 9.3.8)}, 
 pdflang={English}}
\begin{document}

\maketitle
\tableofcontents

\newpage

\section{实验目的}
\label{sec:orgc612098}
\begin{itemize}
\item 掌握 Android 数据存储的相关组件: sharedPreferences 和数据库的相关
操作
\end{itemize}
\section{实验设备和器件}
\label{sec:org564173d}
\begin{itemize}
\item PC
\item 内存要求 8G 以上
\end{itemize}
\section{课堂实训一:Shareprefenrence实训}
\label{sec:org704541b}
\subsection{实训步骤}
\label{sec:org3f78e91}
\begin{itemize}
\item 步骤1: 界面设计: 按照下图设计程序界面,能够接收姓名、密码、和邮箱信息数据，下方两个按钮，一个是保存按钮，
一个是读取按钮。
\begin{center}
\includegraphics[width=.9\linewidth]{img/1.jpg}
\end{center}

\item 步骤2: 添加成员并初始化各项组件
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
private EditText username; // 用户名
private EditText passwd; // 密码
private EditText mail; // 邮件
private Button save; // 保存
private Button load; // 读取
\end{lstlisting}

\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
username = (EditText) findViewById(R.id.username);
passwd = (EditText) findViewById(R.id.passwd);
mail = (EditText) findViewById(R.id.mail);
save = (Button) findViewById(R.id.save);
load = (Button) findViewById(R.id.load);
\end{lstlisting}
\begin{itemize}
\item 步骤3:从Context中获取SharePreference，并设置为私有模式,获得Editor用于数据写入  
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
// 从Context中获取SharePreference，并设置为私有模式
sharedPreferences = getSharedPreferences("usersetting", MODE_PRIVATE);
// 获得Editor用于数据的写入
editor = sharedPreferences.edit();
\end{lstlisting}
\item 步骤4: 从edittext获取数据，并写入文件
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
save.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
	// TODO Auto-generated method stub
	String userString = username.getText().toString();
	String passwdString = passwd.getText().toString();
	String mailString = mail.getText().toString();
	// 往Editor里面存入数据
	editor.putString("username", userString);
	editor.putString("passwd", passwdString);
	editor.putString("mail", mailString);
	// 递交至SharePreference文件
	editor.commit();
	Toast.makeText(MainActivity.this,
		       "数据保存完毕", Toast.LENGTH_SHORT).show();
    }
});
\end{lstlisting}

\begin{itemize}
\item 步骤5: 从SharedPreferences获取数据，显示到edittext内
\end{itemize}
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
load.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
	// TODO Auto-generated method stub
	// 从SharePreference中获取数据
	String userString = sharedPreferences.getString("username", null);
	String passwdString = sharedPreferences.getString("passwd", null);
	String mailString = sharedPreferences.getString("mail", null);

	username.setText(userString);
	passwd.setText(passwdString);
	mail.setText(mailString);

	Toast.makeText(MainActivity.this,
		       "读取数据完毕", Toast.LENGTH_SHORT).show();
    }
});
\end{lstlisting}
\end{itemize}
\end{itemize}
\section{课堂实训二:文件读取实训}
\label{sec:org55dc3e2}
\subsection{实训步骤}
\label{sec:org7e256c1}
\begin{itemize}
\item 步骤1: 按照图示，设计布局组件
\begin{center}
\includegraphics[width=.9\linewidth]{img/2.jpg}
\end{center}

\item 步骤2: 添加主要成员,并通过findViewById方法获取组件引用:
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
private final String FILE_NAME = "fileDemo.txt";
private TextView labelView;
private TextView displayView;
private CheckBox appendBox;
private EditText entryText;
\end{lstlisting}

\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
labelView = (TextView) findViewById(R.id.label);
displayView = (TextView) findViewById(R.id.display);
appendBox = (CheckBox) findViewById(R.id.append);
entryText = (EditText) findViewById(R.id.entry);
Button writeButton = (Button) findViewById(R.id.write);
Button readButton = (Button) findViewById(R.id.read);
\end{lstlisting}

\item 步骤3: 为 read 绑定事件监听器
\end{itemize}
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
// 为 read 绑定事件监听器
View.OnClickListener readButtonListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
	displayView.setText("");
	// 定义文件输入流
	FileInputStream fis = null;
	try {
	    // 获取指定文件对应的存储目录
	    fis = openFileInput(FILE_NAME);
	    if (fis.available() == 0) {
		return;
	    }
	    // 定义临时缓冲区
	    byte[] readBytes = new byte[fis.available()];
	    // 读取文件的内容
	     while (fis.read(readBytes) != -1) {
	     }
	     // 获取文件中的信息
	     String text = new String(readBytes);
	     displayView.setText(text);
	     labelView.setText("文件读取成功，文件长度：" + text.length());
	} catch (FileNotFoundException e) {
	    e.printStackTrace();
	} catch (IOException e) {
	    e.printStackTrace();
	}
    }
};

\end{lstlisting}

\begin{itemize}
\item 步骤4: 为wirte事件绑定监听
\end{itemize}
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
// 为 write 绑定事件监听器
View.OnClickListener writeButtonListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
	// 定义文件输出流
	FileOutputStream fos = null;
	try {
	    // 判断CheckBox是否以追加方式打开文件输出流
	    if (appendBox.isChecked()) {
		fos = openFileOutput(FILE_NAME, Context.MODE_APPEND);
	    } else {
		fos = openFileOutput(FILE_NAME, Context.MODE_PRIVATE);
	    }
	    // 获取EditText组件中的信息
	    String text = entryText.getText().toString();
	    // 将text中的内容写入到文件中
	    fos.write(text.getBytes());
	    labelView.setText("文件写入成功，写入长度：" + text.length());
	    entryText.setText("");
	} catch (FileNotFoundException e) {
	    e.printStackTrace();
	} catch (IOException e) {
	    e.printStackTrace();
	} finally {
	    if (fos != null) {
		try {
		    // 刷新资源
		    fos.flush();
		    // 关闭资源
		    fos.close();
		} catch (IOException e) {
		    e.printStackTrace();
		}
	    }
	}
    }
};
\end{lstlisting}

\begin{itemize}
\item 步骤5: 添加监听
\lstset{language=java,label= ,caption= ,captionpos=b,numbers=none}
\begin{lstlisting}
writeButton.setOnClickListener(writeButtonListener);
readButton.setOnClickListener(readButtonListener);
\end{lstlisting}
\end{itemize}


\begin{itemize}
\item 步骤6: 调试
调试时要通过adb shell查看是否在对应的位置生成了对应的文件，使用Linux命令查看文件内容是否跟生成的一致
\item 注意:关于文件权限导致的IOExeption异常可查看
一下\href{https://blog.csdn.net/a40850273/article/details/81390132}{文件读写权限异常}
\end{itemize}
\end{document}